/**
 * String不像int是个基本类型，而是一种特殊的类，是java中唯一能重载运算符的类型。唯一能使用+号来连接的类型
 * 使用+或+=进行拼接，相当于对+运算符进行了重载，形成了新的String对象
 * 字符串创建后是不可变的，所以两个字符串拼接是一个新的对象
 */
public class Main10 {
    public static void main(String[] args) {
        String kong = "";  //就算是一个空字符串，也是一个对象，也有很多方法可以用，使用"".来根据提示有哪些方法
        String kong2 = new String(""); //等价于上一个语句，但这么写容易理解，和普通的类创建对象一样。
        String str1 = "asdf";
        // String类的常用方法举例
        str1.toUpperCase();  //转成大写，可以写成str1.toUpperCase().sout，idea自动帮我们转成下面的格式
        System.out.println(str1.toUpperCase());
        str1.charAt(1); // chatArt是用来调用某个位的字符，同样在后面加.sout，自动帮我们优化成下面的格式
        System.out.println(str1.charAt(1));  //索引从0开始
        str1.contains("as"); //contains用来判断是否包含某些字符或字符串，同样在后面加.sout，自动帮我们优化成下面的格式
        System.out.println(str1.contains("as")); //返回的是布尔类型的结果，ture或false

        //判断两个对象是否为同一个对象
        String str2 = "asdf";
        System.out.println(str1 == str2);
        //String不是基本类型，是引用类型，给两个对象中间放 ==，表示判断的两个对象是不是同一个对象
        //这里虽然str1和str2指向的字符串相同，但不是同一个对象，是两个对象，理论上应该是false。
        // 但打印却为true，是因为jvm底层优化，两个值相等，认为是同一个对象

        System.out.println(str1.equals(str2));  //点击idea的提示，即可改成这种格式str1.equals(str2)
        //String 对象的值比价，使用equals比较。

        //比如直接拼接的两个字符串，看编译的class文件，会发现把两个字符串合成为一个
        String str6 = "asdb" + "edf";

        String str3 = "abcd";
        String str4 = "efg";
        String str5 = str3 + str4;  //拼接形成新的对象
        String str55 = (new StringBuilder(String.valueOf(str3))).append(str4).toString();
        System.out.println(str5);
        System.out.println(str55);
        //对象频繁创建很费时间，同时占用内存，所以大量拼接字符串不优雅，
        //编译器很聪明，String字符串的拼接，有可能被编译器优化成StringBuilder类来减少对象创建
        //但如果像上面的str3和str4变量赋值的形式，变量随时可变，在编译时无法确定str6的值，就只能在运行时确定，显示使用拼接更快



        //使用StringBuilder类更优雅
        StringBuilder sb = new StringBuilder("a"); //创建新的StringBuilder对象时，可以给个初始值，也可以不给
        sb
                .append("b")
                .append("c")
                .append("d"); //StringBuilder对象可以一直append下去，比字符串拼接要好，不用创建很多字符串对象。
        System.out.println(sb);

        String str7 = "123";
        String str8 = "456";
        str8 += str7;  //str8 = str8 + str7;
        System.out.println(str8);
    }
}
